namespace py rpc

typedef i16 short
typedef i32 int
typedef i64 long
typedef string String
typedef bool boolean
typedef binary bytes

struct CVEInfo {
}

struct VulnResult {
    1: optional String test_src_file;       // 被检测出来漏洞的源文件
    2: optional String test_func;           // 被检测出漏洞的函数
    3: optional String from_repo_name;      // 漏洞来源repo
    4: optional String from_src_file;       // 漏洞来源源文件
    5: optional String from_func;           // 漏洞来源函数
    6: optional String vuln_fixed_commit;   // 在漏洞来源repo中，漏洞被fix的commit版本
    7: optional String vuln_name;           // 漏洞名称（CVE，CWE）
    8: optional CVEInfo cve_info;           // CVE漏洞的详细信息
    9: optional double prob;                // 漏洞概率
}

struct QueryHistoryResult {
    1: optional short status_code;          // -1表示内部出错，0表示排队中，1表示执行中，2表示查询完毕
    2: optional double progress;	        // 表示查询进度
    3: optional list<VulnResult> vuln_results;	    // 仅当progress为100的时候才本字段才不会为空
    4: optional int LoC;                    // 本次检测总共检测的代码行数
    5: optional String err_msg;             // 错误信息
    6: optional int queuing_cost;           // 排队耗时
    7: optional int running_cost;           // 运行耗时
}

struct AsyncQueryResult {
    1: optional short status_code;          // -1表示内部出错，0表示查询成功
    2: optional string key;                 // 查询key
    3: optional String err_msg;             // 错误信息
}


exception DataException {
    1: optional String message;
    2: optional String traceback;
    3: optional String date;
}

// 表示用于漏洞查询的服务
service VulnQueryService {
    // 发起一个异步查询，查询后立即返回结果，结果包含的是一个用于历史查询的key
    // data为二进制数据，其有codec控制，通常传过来是压缩后的数据
    AsyncQueryResult async_query(1: required list<String> names, 2: required list<bytes> datas)
        throws (1: DataException dataException);

    // 用于历史查询
    QueryHistoryResult query_history(1: required string key)
        throws (1: DataException dataException);
}
